package com.jt.resource.controller;

import com.jt.resource.annotation.RequiredLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * @author 金帮嘉诚 @date 2021-08-22 星期日 11:01
 * 通过此对象实现文件上传服务
 */
@Slf4j
@RestController
@RequestMapping("/resource")
//@CrossOrigin
public class ResourceController {
    //加上@Slf4j 就不用自己创建下面的日志对象
//    private final static Logger log= LoggerFactory.getLogger(ResourceController.class);

    //为了使这些地址是可修改的 要在配置中心设置
    @Value("${jt.resource.path:E://testFiles/}")
    private String resourcePath;//本地文件夹前缀
    @Value("${jt.resource.host:http://localhost:8881/}")
    private String virtualHead;//网络路径ip和端口前缀
//    private String resourceHost;//网络路径ip和端口前缀

    //将RequiredLog注解描述的方法作为切入点方法,在方法执行之前和之后进行日志记录
    //@PreAuthorize注解描述的方法表示必须已认证用户且有sys:res:create这个权限才可以访问
    @PreAuthorize("hasAuthority('sys:res:create')")
    @RequiredLog("文件上传")//扩展业务->日志记录
    @PostMapping("/upload/")//上传核心业务

        public String upload(MultipartFile uploadFile) throws IOException {/*html中提交的参数名和这里要相同*/
        //1.目录创建
        /*文件路径可以分为三部分:前缀,日期,文件全名(包括文件类型)
        * 前缀:实际前缀如resourcePath 或者是 虚拟前缀virtualHead
        * 日期:根据日期生成的几层文件夹
        * 文件全名:uuid加上文件类型后缀
        * */
        //1.1 获取当前年月日的目录名
        String dateDir = DateTimeFormatter.ofPattern("yyyy/MM/dd/")
                .format(LocalDate.now());//LocalDate是年月日
        //1.2 构建目录文件对象

        File uploadFileDir = new File(resourcePath, dateDir);
        if (!uploadFileDir.exists()) uploadFileDir.mkdirs();


        //2.文件起名 尽量不重复
        //2.1 获取源文件后缀
        String originalFilename = uploadFile.getOriginalFilename();//文件名
        String ext = originalFilename.substring(originalFilename.lastIndexOf("."));//后缀
        String newFilePreFix = UUID.randomUUID().toString();//前缀
        String newFileName = newFilePreFix + ext;//新文件名
        //3.文件上传
        //3.1 构建新的文件对象 指向实际上传的最终地址
        File file = new File(uploadFileDir, newFileName);
        //3.2 上传文件(写文件数据)
        uploadFile.transferTo(file);

        //虚拟路径
        String fileVirtualPath = virtualHead + dateDir + newFileName;
        log.debug("fileRealPath:   "+file.getPath());
        log.debug("fileVirtualPath:  "+fileVirtualPath);
        //返回虚拟路径
        return fileVirtualPath;

    }


}
